import StringUtils from "../commons/string-utils";
import Utils from "../core/utils";
/**
 * 基础的数据格式转换
 *
 * @param num {any}         数值
 * @param call {function}   回调函数
 * @returns {string}        非空字符串
 */
function caseNumber(num, call) {
    if (Utils.isBlank(num)) {
        return '';
    } else {
        const n = Number(num);
        if (Number.isNaN(n)) {
            return num;
        } else {
            return call(n);
        }
    }
}


/**
 * 日期的数据格式转换
 *
 * @param num {any}         数值
 * @param call {function}   回调函数
 * @returns {string}        非空字符串
 */
function caseDate(num, call) {
    if (Utils.isBlank(num)) {
        return '';
    } else {
        return call(num);
    }
}

/**
 * 文本本格式化工具
 * <p>
 * 尝试进行格式转换：
 *
 * 1、如果转换成功，则使用转换之后的格式；
 * 2、如果转换失败，则原样输出；
 * 3、如果未定义，则转为空串。
 */
class Text {

    /**
     * 简洁的流逝时间格式
     *
     * 类似于：活动还剩下 "3天"，省略不足一天的数据
     *
     * @param millis {any}      时间毫秒
     * @return {string}         流逝时间
     */
    static elapsedTime = (millis) => {
        return caseNumber(millis, StringUtils.elapsedTime);
    }

    /**
     * 流逝时间格式转换
     *
     * 类似于：活动还剩下 "3天12分"
     *
     * @param millis {any}      时间毫秒
     * @param trim {boolean}    是否去除 0 值
     * @return {string}         流逝时间
     */
    static fullyElapsedTime = (millis, trim = true) => {
        if (trim) {
            return caseNumber(millis, StringUtils.fullyElapsedTime);
        } else {
            return caseNumber(millis, StringUtils.fullyElapsedTime2);
        }
    }

    /**
     * 数值转换为带单位的文件大小
     *
     * @param size {any}    文件大小
     * @return {string}     流逝时间
     */
    static fileSize = (size) => {
        return caseNumber(size, StringUtils.filesize);
    }

    /**
     * 转换为字符串类型
     *
     * @param val{*}   对象
     * @returns {string}
     */
    static date = (val) => {
        return caseDate(val, StringUtils.date);
    }

    /**
     * 转换为字符串类型
     *
     * @param val{*}   对象
     * @returns {string}
     */
    static chnWeek = (val) => {
        return caseDate(val, StringUtils.chnWeek);
    }

    /**
     * 转换为字符串类型
     *
     * @param val{*}   对象
     * @returns {string}
     */
    static datetime = (val) => {
        return caseDate(val, StringUtils.datetime);
    }

    /**
     * 转换为字符串类型
     *
     * @param val{*}   对象
     * @returns {string}
     */
    static compactDate = (val) => {
        return caseDate(val, StringUtils.compactDate);
    }

    /**
     * 转换为字符串类型
     *
     * @param val{*}   对象
     * @returns {string}
     */
    static compactDatetime = (val) => {
        return caseDate(val, StringUtils.compactDatetime);
    }

    /**
     * 处理日期对象
     *
     * @param obj {DateTimeObject}  日期对象
     * @returns {string}
     */
    static objectToDate = (obj) => {
        return caseDate(obj, StringUtils.objectToDate);
    }

    /**
     * 处理日期对象
     *
     * @param obj {DateTimeObject}  日期对象
     * @returns {string}
     */
    static objectToDatetime = (obj) => {
        return caseDate(obj, StringUtils.objectToDatetime);
    }

    /**
     * 处理日期对象
     *
     * @param obj {DateTimeObject}  日期对象
     * @returns {string}
     */
    static objectToCompactDate = (obj) => {
        return caseDate(obj, StringUtils.objectToCompactDate);
    }

    /**
     * 处理日期对象
     *
     * @param obj {DateTimeObject}  日期对象
     * @returns {string}
     */
    static objectToCompactDatetime = (obj) => {
        return caseDate(obj, StringUtils.objectToCompactDatetime);
    }

    /**
     * 数字除以 10000，并四舍五入保留整数
     *
     * @param num
     * @returns {number}
     */
    static myriad = (num) => {
        return caseNumber(num, StringUtils.myriad);
    }

    /**
     * 使用千位分隔符格式化数字
     *
     * @param num {number} 数字
     * @returns {string}
     */
    static numWithCommas = (num) => {
        return caseNumber(num, StringUtils.numWithCommas);
    }

    /**
     * 四舍五入
     *
     * @param num
     * @returns {number}
     */
    static round = (num) => {
        return caseNumber(num, Math.round);
    }

    /**
     * 保留 2 位小数进行四舍五入
     *
     * @param num
     * @returns {number}
     */
    static round2 = (num) => {
        return caseNumber(num, StringUtils.round2);
    }
}

export default Text;
